# json 文件也是种文本文件，故一般文件的操作也可以用在它身上，但是它也有自己专用的操作
# json 独立于语言，意味着任何编程语言均可使用；同时在同样多的数据情况下，选择它这种格式就可以做到占用较小；它是一种数据交换格式，类似于 html，xml
# 通常，测试数据是定义成 json 文件格式的，方便维护
# json 中主要的数据类型是对象和数组，前者类似 Python 的字典，{}表示，后者类似 Python 的列表，[]表示，两者可以相互嵌套
# 一个 json 文件是一个对象或是一个数组，也即它的最外层必然不是{}就是[]
# json 字符串必须使用双引号定义，同时它将整数类型和浮点数类型合称数字类型，它的布尔类型都是小写的真假，它的空用 null 表示
# 需求：我叫小明，今年18岁，性别男，爱好有听歌；游戏；购物；吃饭；睡觉；打豆豆，我的居住地址是：国家中国，城市上海
# 若想将需求内的内容转成数据，最应该想到的是字典保存，若用 json 文件来实现，那就是使用对象
# 创建一个 json 文件需要以文本文件的方式新建，文件后缀更改为对应格式即可
# json 文件的读取：
import json  # 这是第一步，导入 json
with open('test.json', encoding='UTF-8') as j:  # 打开文件的操作和一般文件的非常相似
    # print(json.load(j))  # 这是读 json 文件的语句，其中括号内写的是文件对象
    received = json.load(j)
    print(received[0].get('name'), received[0].get('address').get('city'), sep='同学住在')
    print(received[1].get('name'), received[1].get('address').get('city'), sep='同学住在')
    received_selected = received[2:]
    lst = []
    for x in received_selected:
        lst1 = []
        for y in x.values():
            lst1.append(y)
        lst2 = lst1[1:]
        tp2 = tuple(lst2)
        lst.append(tp2)
    print(lst)
    # print(received.get('address').get('city'))
    # print(received.get('hobby')[-1])
# 从结果可以显然见到：会按照 Python 的规范输出内容
# json 文件的写入：
with open('test1.json', 'w', encoding='UTF-8') as j:  # 只能使用mode='w'，因为使用 a 的话，会在末尾追加，这会违反 json 的规范
    json.dump([('admin', '123456', '登录成功'), ('root', '123456', '登录失败'), ('admin', '123123', '登录失败')], j, ensure_ascii=False)
with open('test1.json', encoding='UTF-8')as j:
    print(json.load(j))
with open('test1.json', 'w', encoding='UTF-8') as j:  # 显然，再次使用mode='w'必然导致覆盖的发生
    json.dump([('admin', '123456', '登录成功'), ('root', '123456', '登录失败')], j, ensure_ascii=False)
with open('test1.json', encoding='UTF-8')as j:
    print(json.load(j))
# 结果可见写入时要按照 Python 的规范，在 json 文件中会自动转成它规定的格式，如写入时的单引号会换为双引号，元组会变为数组
